package controllers

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"log"
	"net/http"
	"rongyy/src/models"
	"rongyy/src/server"
	"rongyy/src/service"
)

type UserController struct {
	*service.UserService
}

func NewUserController() *UserController {
	return &UserController{}
}

func (u *UserController) Test(ctx *gin.Context) string {
	return "bosuai"
}

func (u *UserController) CreateUser(ctx *gin.Context) server.IModel {
	req := &models.UserModel{}

	err := ctx.ShouldBindJSON(req)
	err = u.Create(req)
	if err != nil {
		log.Println("decode: ", err)
	}
	return &models.DataModel{Msg: "新建成功"}
}

func (u *UserController) GetByUnionid(c *gin.Context) server.IModel {
	json := &models.ReqUnionid{}
	err := c.ShouldBindJSON(json)
	if err != nil {
		log.Println("decode: ", err)
	}
	if len(json.Unionid) < 10 {
		return &models.DataModel{IsSuccess: false, Msg: "无效参数"}
	}
	user, has, err := u.FindByUnionid(json.Unionid)
	fmt.Println(user)
	if err != nil {
		return &models.DataModel{IsSuccess: false, Msg: err.Error()}
	}
	if !has {
		return &models.DataModel{Msg: "查无此人"}
	}
	return &models.DataModel{Data: user}
}

//
//func (u *UserController) GetById(c *gin.Context) server.IModel {
//	json := &models.ReqId{}
//	err := c.ShouldBindJSON(json)
//	if err != nil {
//		log.Println("decode: ", err)
//	}
//
//	user, has, err := u.FindById(json.Id)
//	if err != nil {
//		return &models.DataModel{Error: err}
//	}
//	if !has {
//		return &models.DataModel{Msg: "查无此人"}
//	}
//	return &models.DataModel{Data: user}
//}

//func (u *UserController) UpdateMpOpenid(c *gin.Context) server.IModel {
//	req := &models.ReqUpdateMpOpenid{}
//	err := c.ShouldBindJSON(req)
//	if err != nil {
//		log.Println("decode: ", err)
//	}
//
//	err = u.UpdateOpenid(req.Unionid, req.MpOpenid, req.Hospital)
//	if err != nil {
//		return &models.DataModel{Error: err}
//	}
//	user, _, err := u.FindByUnionid(req.Unionid, req.Hospital)
//	return &models.DataModel{Data: user}
//}

//
//func (u *UserController) GetUserCardsByUnionid(c *gin.Context) server.IModel {
//	req := &models.ReqGetCards{}
//	err := c.ShouldBindJSON(req)
//	if err != nil {
//		log.Println("decode: ", err)
//	}
//	cards, err := u.FindCardsByUnionid(req.Unionid, req.Hospital)
//	if err != nil {
//		return &models.DataModel{Error: err}
//	}
//	return &models.DataModel{Data: cards}
//}
//
//func (u *UserController) GetAllUsers(c *gin.Context) server.IModel {
//	req := &models.ReqGetCards{}
//	err := c.ShouldBindJSON(req)
//	if err != nil {
//		log.Println("decode: ", err)
//	}
//	users, err := u.GetAll(req.Hospital)
//	if err != nil {
//		return &models.DataModel{Error: err}
//	}
//	fmt.Println(users)
//	return &models.DataModel{Data: users}
//}

//
//func (u *UserController) UpdateUnionidById(c *gin.Context) server.IModel {
//	req := &models.UserModel{}
//	err := c.ShouldBindJSON(req)
//	if err != nil {
//		log.Println("decode: ", err)
//	}
//	err = u.UpdateUnionidByWxId(req.Id, req.Unionid, req.Hospital)
//	if err != nil {
//		return &models.DataModel{Data: err}
//	}
//	return &models.DataModel{Data: "更新成功"}
//}
//
//func (u *UserController) syncUnionId(c *gin.Context) server.IModel {
//	token := c.Query("token")
//	card := &models.CardModel{}
//	binds, err := card.BatchGetItems(constants.CD10YY)
//	if err != nil {
//		fmt.Println(err)
//	}
//
//	for _, v := range binds {
//		unionId, err := getUnionId(v.Openid, token)
//		if err != nil {
//			return &models.DataModel{Error: err}
//		}
//		v.Unionid = unionId
//		err = card.InsertCardBindModel(&v)
//		if err != nil {
//
//		}
//	}
//	return &models.DataModel{Data: "更新成功"}
//
//}

func getUnionId(openId, token string) (string, error) {
	url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN", token, openId)
	resp, err := http.Get(url)
	if err != nil {
		fmt.Println(err)
		return "", err
	}
	defer resp.Body.Close()

	type userInfo struct {
		Subscribe      int8     `json:"subscribe"`
		OpenId         string   `json:"openid"`
		Nickname       string   `json:"nickname"`
		Sex            int8     `json:"sex"`
		Language       string   `json:"language"`
		Province       string   `json:"province"`
		City           string   `json:"city"`
		Country        string   `json:"country"`
		HeadImgUrl     string   `json:"headimgurl"`
		SubscribeTime  int64    `json:"subscribe_time"`
		UnionId        string   `json:"unionid"`
		Remark         string   `json:"remark"`
		GroupId        int8     `json:"groupid"`
		TagIdList      []string `json:"tagid_list"`
		SubscribeScene string   `json:"subscribe_scene"`
		QrScene        int64    `json:"qr_scene"`
		QrSceneStr     string   `json:"qr_scene_str"`
	}

	ui := &userInfo{}
	body, err := ioutil.ReadAll(resp.Body)
	err = json.Unmarshal(body, ui)
	if err != nil {
		fmt.Println(err)
		return "", err
	}

	return ui.UnionId, nil
}

type newWxUser struct {
	Data        openids `json:"data"`
	NextOpenid  string  `json:"next_openid"`
	Total       int64   `json:"total"`
	AccessToken string  `json:"access_token"`
	Errcode     int     `json:"errcode"`
}

type openids struct {
	Openid []string `json:"openid"`
}

//
//func (u *UserController) syncAllOpenid(c *gin.Context) server.IModel {
//	openid := c.Query("openid")
//	// cyc := c.Query("cyc")
//	// intcyc, _ := strconv.Atoi(cyc)
//	// var x int
//	// status := true
//	// openid = "!"
//	times := 0
//	// for {
//	// if openid != "" {
//	//   if status {
//	//     status = false
//	//     openid = ""
//	//   }
//	// ui := &newWxUser{}
//	// url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxa7351a6630b55d4c&secret=d54dbd647da4670de44f36b59cbcf458")
//	// resp, err := http.Get(url)
//	// if err != nil {
//	//   fmt.Println(err)
//	//   return &models.DataModel{Error: err}
//	// }
//	// defer resp.Body.Close()
//	// body, err := ioutil.ReadAll(resp.Body)
//	// err = json.Unmarshal(body, ui)
//	//
//	// println("ui", string(body))
//
//	url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=%s&lang=zh_CN", "40_iTFpDKZzYOyOhOjikTN42nHhsq12m5tgAXzzPt77LWOcWwI7h47RVvJ2-fD7kNxXDrRo5e02DH013qYi6t74nL81o0xUXojmd0kYkJgzF-_I-wI1j27okN6lvgnXfOUnIlGTqo4dJMQMjEJPVZZiAEAOSS", openid)
//	resp, err := http.Get(url)
//	if err != nil {
//		fmt.Println(err)
//		return &models.DataModel{Error: err}
//	}
//	defer resp.Body.Close()
//	body, err := ioutil.ReadAll(resp.Body)
//	nui := &newWxUser{}
//	err = json.Unmarshal(body, nui)
//	if err != nil {
//		fmt.Println(err)
//		return &models.DataModel{Data: nui}
//	}
//
//	println("nui", string(body))
//	// go func() {
//	now := time.Now()
//	times += 1
//	// println("NextOpenid", openid,nui.NextOpenid, times)
//	openid = nui.NextOpenid
//	opids := nui.Data.Openid
//	var i int
//	for i = 0; i < len(opids); i++ {
//		// fmt.Println(i)
//		newWxUser := &models.NewWxUser{}
//		newWxUser.Openid = opids[i]
//		err = u.CreateNewWxUser("CD7YY", newWxUser)
//		if err != nil {
//			fmt.Println(err)
//			// return
//			return &models.DataModel{Error: err}
//		}
//	}
//	println("time =", now.Unix()-time.Now().Unix())
//	// }()
//	// }
//	// if times > 28 {
//	//   break
//	// }
//	// }
//	return &models.DataModel{Data: "更新完成"}
//}

//
//func (u *UserController) syncAllWxUser(c *gin.Context) server.IModel {
//	// hospitalCode := c.Query("hospitalCode")
//	// token := c.Query("token")
//	limit := c.Query("limit")
//	offset := c.Query("offset")
//	intlimit, _ := strconv.Atoi(limit)
//	intoffset, _ := strconv.Atoi(offset)
//
//	return u.syncAllWxUserAutoToken(intlimit, intoffset)
//}

// var tokenStatus = true
//
//func (u *UserController) syncAllWxUserAutoToken(intlimit, intoffset int) server.IModel {
//	ui := &newWxUser{}
//	url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxa7351a6630b55d4c&secret=d54dbd647da4670de44f36b59cbcf458")
//	resp, err := http.Get(url)
//	if err != nil {
//		fmt.Println(err)
//		return &models.DataModel{Error: err}
//	}
//	defer resp.Body.Close()
//	body, err := ioutil.ReadAll(resp.Body)
//	err = json.Unmarshal(body, ui)
//
//	// if tokenStatus {
//	//   tokenStatus = false
//	//   ui.AccessToken = "111"
//	// }
//
//	users, total, err := (&models.UserModel{}).GetAllUsersWithoutUnionid("", intlimit, intoffset)
//	if err != nil {
//		return &models.DataModel{Error: err}
//	}
//	var i int
//	for i = 0; i < len(users); i++ {
//		newurl := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN",
//			ui.AccessToken, users[i].Openid)
//		resp, err := http.Get(newurl)
//		if err != nil {
//			fmt.Println(err)
//			return &models.DataModel{Error: err}
//		}
//		defer resp.Body.Close()
//		newWxUser := &models.NewWxUser{}
//		body, err := ioutil.ReadAll(resp.Body)
//		println(string(body))
//		err = json.Unmarshal(body, newWxUser)
//		if newWxUser.Errcode > 0 {
//			// return &models.DataModel{Msg: "token 过期"}
//			println("newWxUser.Errcode")
//			return u.syncAllWxUserAutoToken(intlimit, intoffset)
//		}
//		newWxUser.Id = users[i].Id
//		err = u.UpdateNewWxUser("", newWxUser)
//		if err != nil {
//			fmt.Println(err)
//			return &models.DataModel{Error: err}
//		}
//
//	}
//	fmt.Println("=====", total)
//	return &models.DataModel{Data: "更新完成"}
//}

func (u *UserController) wxLogin(c *gin.Context) server.IModel {
	req := &models.ReqWxLogin{}
	if err := c.ShouldBindJSON(req); err != nil {
		//middlewares.Logger.Println("ERROR - wxLogin bind json failed ", err)
		return &models.DataModel{IsSuccess: false, Msg: err.Error()}
	}
	data, err := u.WxLogin(req)
	if err != nil {
		return &models.DataModel{IsSuccess: false, Msg: err.Error()}
	}
	return &models.DataModel{IsSuccess: true, Data: data}
}

func (us *UserController) profile(c *gin.Context) server.IModel {
	req := &models.UserModel{}
	if err := c.ShouldBindJSON(req); err != nil {
		//middlewares.Logger.Println("ERROR - wxLogin bind json failed ", err)
		return &models.DataModel{IsSuccess: false, Msg: err.Error()}
	}
	if len(req.Unionid) < 10 {
		return &models.DataModel{IsSuccess: false, Msg: "无效参数"}
	}
	wx, has, err := us.UserWxInfo(req)
	if !has {
		return &models.DataModel{IsSuccess: false, Msg: "查无此人"}
	}
	if err != nil {
		return &models.DataModel{IsSuccess: false, Msg: err.Error()}
	}
	data, _, err := us.Profile(req)
	if err != nil {
		return &models.DataModel{IsSuccess: false, Msg: err.Error()}
	}
	return &models.DataModel{IsSuccess: true, Data: map[string]interface{}{
		"list": data,
		"wx":   wx,
	}}
}

func (u *UserController) RouterHandler(server *server.Server) {
	//server.Handle(http.MethodGet, "/sync", u.syncUnionId)
	//server.Handle(http.MethodGet, "/test", u.test)
	server.Handle(http.MethodPost, "/create", u.CreateUser)
	server.Handle(http.MethodPost, "/getByUnionid", u.GetByUnionid)
	//server.Handle(http.MethodPost, "/getById", u.GetById)
	//server.Handle(http.MethodPost, "/updateMpOpenid", u.UpdateMpOpenid)
	//server.Handle(http.MethodPost, "/getUserCardsByUnionid", u.GetUserCardsByUnionid)
	//server.Handle(http.MethodPost, "/getAllUsers", u.GetAllUsers)
	//server.Handle(http.MethodPost, "/updateUnionidById", u.UpdateUnionidById)
	//server.Handle(http.MethodGet, "/syncAllWxUser", u.syncAllWxUser)
	//server.Handle(http.MethodGet, "/syncAllOpenid", u.syncAllOpenid)
	server.Handle(http.MethodPost, "/wxLogin", u.wxLogin)
	server.Handle(http.MethodPost, "/profile", u.profile)
}
